package DAO;

import Model.Frete;
import Model.ItemFrete;
import Util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author Gilberto Toledo
 */
public class FreteDAO {
    
    public static int QuantFretes(){
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql = "SELECT COUNT(cod_frete) FROM frete";
        int cont = 0;
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            if(rs.next()) {
                cont = rs.getInt("COUNT");
            }
            st.close();
            rs.close();
            
            return cont;
        } catch (SQLException ex) {
            System.out.printf("Erro: "+ex.getMessage());
            return cont;
        }
    }

    public static ArrayList getListaFretes(){
        ArrayList<Frete> ListaFretes = new ArrayList();
        
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql = "SELECT cod_frete,nome_rem,nome_dest,valor_frete,orcamento FROM frete ORDER BY cod_frete DESC";
        
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            while (rs.next()) {
                Frete F = new Frete();
                F.setCodigoFrete(rs.getInt("cod_frete"));
                F.setNomeRem(rs.getString("nome_rem"));
                F.setNomeDest(rs.getString("nome_dest"));
                F.setValorFrete(rs.getFloat("valor_frete"));
                F.setOrcamento(rs.getBoolean("orcamento"));
                ListaFretes.add(F);
                
            }
            st.close();
            rs.close();
            
            return ListaFretes;
        } catch (SQLException ex) {
            System.out.printf("Erro: "+ex.getMessage());
            return null;
        }
    }
    
    public static int ProximoFrete(){
        int cod;
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "SELECT cod_frete FROM frete ORDER BY cod_frete DESC";
        
        try {
            Statement st = con.createStatement();      
            ResultSet rs = st.executeQuery(sql);
            
            if(rs.next()){
                cod = rs.getInt("cod_frete");
                cod++;
            }else{
                cod = 1;
            }
            
            st.close();
            rs.close();
            return cod;
        } catch (SQLException ex) {
            return 1;
        }
    }
        
    
    public static ArrayList getCidades(){
        ArrayList<String> Cidades = new ArrayList();
        
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql = "SELECT nome FROM cidade ORDER BY nome ASC";
        Statement st;
        ResultSet rs;
        try {
            st = con.createStatement();
            rs = st.executeQuery(sql);
            
            while (rs.next()) {    
                Cidades.add(rs.getString("nome"));
            }
            
            st.close();
            rs.close();
            return Cidades;
        } catch (SQLException ex) {
            System.out.printf("Erro: "+ex.getMessage());
        }
        
        return Cidades;
    }
    
    public static double getDistancia(String CidOrig, String CidDest){
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "SELECT d.distancia FROM cidade cO, cidade cD, distancia d "
                + "WHERE (cO.Nome LIKE '"+CidOrig+"' AND cD.Nome LIKE '"+CidDest+"'"
                + "AND cO.Codigo = d.CidOri AND cD.Codigo = d.CidDest)"
                + "OR"
                + "(cO.Nome LIKE '"+CidDest+"' AND cD.Nome LIKE '"+CidOrig+"'"
                + "AND cO.Codigo = d.CidOri AND cD.Codigo = d.CidDest)";
        
        
        float Distancia = 0;
        
        try {
            Statement st = con.createStatement();
            
            ResultSet rs = st.executeQuery(sql);
            
            rs.next();
            
            Distancia = rs.getFloat("distancia");
            
            st.close();
            rs.close();
            return Distancia;
        } catch (SQLException ex) {
            System.out.printf("Erro: "+ex.getMessage());
        }

        return Distancia;
    }
    
    public static boolean ExisteFrete(int cod){
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "SELECT cod_frete FROM frete WHERE cod_frete = '"+cod+"'";
        
        boolean existe;
        
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            if(rs.next()){
                existe = true;
            }else{
                existe = false;
            }
            /*
            rs.getString("codigo");
            if(rs.wasNull()) existe = false; //if(rs.getString("cod_frete") == null) 
            else existe = true;
            */
            st.close();
            rs.close();
            
            return existe;
            
        } catch (SQLException ex) {
            System.out.printf("Existe frete -> Erro: "+ex.getMessage()+"\n");
            return false;
        }

    }
    
    public static boolean ExisteItem(int cod){
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "SELECT cod_item FROM item_frete WHERE cod_item = '"+cod+"'";
        
        boolean existe;
        
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            if(rs.next()){
                existe = true;
            }else{
                existe = false;
            }
            
            st.close();
            rs.close();
            
            return existe;
            
        } catch (SQLException ex) {
            System.out.printf("Existe item -> Erro: "+ex.getMessage()+"\n");
            return false;
        }

    }
    
    
    public static int CodigoCidade(String cid){
        int cod = 0;
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "SELECT codigo FROM cidade WHERE nome LIKE '"+cid+"'";
        
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            rs.next();
            
            cod = rs.getInt("codigo");
            rs.close();
            st.close();
            
        } catch (SQLException ex) {
            System.out.printf("Erro: "+ex.getMessage());
        }
        return cod;
    }
    
    public static boolean UpdateFrete(Frete F){
        String sql;
        String sql_item = "";
        
        ArrayList<ItemFrete> Itens = F.getItensFrete();
        
        int orcamento = 0;
        if(F.isOrcamento()){
            orcamento = 1;
        }
        
        int CodCidRem  = CodigoCidade( F.getNomeCidRem() );
        int CodCidDest = CodigoCidade( F.getNomeCidDest() );
        
        sql = "UPDATE frete SET CEP_Rem = '"+F.getCEPRem()+"',Nome_Rem='"+F.getNomeRem()+"',End_Rem = '"+F.getEndRem()+"',"
            +"Bai_Rem = '"+F.getBaiRem()+"', Cod_Cid_Rem = '"+CodCidRem+"',Num_Rem = '"+F.getNumRem()+"',UF_Rem = '"+F.getUFRem()+"',CPF_Rem = '"+F.getCPFRem()+"',"
            + "Cel_Rem = '"+F.getCelRem()+"',Tel_Rem = '"+F.getTelRem()+"',Email_Rem = '"+F.getEmailRem()+"',"
            + "CEP_Dest = '"+F.getCEPDest()+"', Nome_Dest = '"+F.getNomeDest()+"', End_Dest = '"+F.getEndDest()+"',"
            + "Bai_Dest = '"+F.getBaiDest()+"',Cod_Cid_Dest = '"+CodCidDest+"',"
            + "Num_Dest = '"+F.getNumDest()+"',UF_Dest = '"+F.getUFDest()+"',"
            + "Modalidade = '"+F.getModalidade()+"',Valor_Frete = '"+F.getValorFrete()+"', Orcamento = '"+orcamento+"'"
            + "WHERE cod_frete = '"+F.getCodigoFrete()+"'";
        Connection con = (Connection) FabricaConexao.GetConexao();
        try {
            Statement st = con.prepareStatement(sql);
            st.executeUpdate(sql);
            
            ExcluirItens(F.getCodigoFrete());
            
            
            for(int i=0;i<Itens.size();i++){
                sql_item = "INSERT INTO item_frete (Cod_Frete,Cod_Item,Peso,Volume,Embalagem) "
                        + "VALUES"
                        + "('"+F.getCodigoFrete()+"','"
                        +Itens.get(i).getCodigoItem()+"','"
                        +Itens.get(i).getPeso()+"','"
                        +Itens.get(i).getVolume()+"','"
                        +Itens.get(i).getEmbalagem()+"')";
                st.executeUpdate(sql_item);
            }
            st.close();
            return true;
        } catch (SQLException ex) {
            System.out.println("Update frete -> Erro: "+ex.getMessage()+"\n"+"SQL -> "+sql_item+"\n\n");
            return false;
        }
    }
    
    public static boolean InsertItens(int CodFrete, ArrayList<ItemFrete> Itens){
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql;
        try {
            
            
            for(int i=0;i<Itens.size();i++){
                sql = "INSERT INTO item_frete (Cod_Frete,Cod_Item,Peso,Volume,Embalagem) "
                        + "VALUES"
                        + "('"+CodFrete+"','"
                        +Itens.get(i).getCodigoItem()+"','"
                        +Itens.get(i).getPeso()+"','"
                        +Itens.get(i).getVolume()+"','"
                        +Itens.get(i).getEmbalagem()+"')";
                Statement st = con.prepareStatement(sql);
                st.executeUpdate(sql);
                st.close();
            }
            return true;
        } catch (SQLException ex) {
            System.out.println("Insert frete -> Erro: "+ex.getMessage()+"\n");
            return false;
        }
        
    }
    
    public static boolean InsertFrete(Frete F){
        String sql;
       
        int orcamento = 0;
        if(F.isOrcamento()){
            orcamento = 1;
        }
        
        int CodCidRem  = CodigoCidade( F.getNomeCidRem() );
        int CodCidDest = CodigoCidade( F.getNomeCidDest() );
        
        sql = "INSERT INTO frete (Cod_Frete,"
            + "CEP_Rem,Nome_Rem,End_Rem,Bai_Rem,Cod_Cid_Rem,Num_Rem,UF_Rem,CPF_Rem,Cel_Rem,Tel_Rem,Email_Rem,"
            + "CEP_Dest, Nome_Dest, End_Dest,Bai_Dest,Cod_Cid_Dest,Num_Dest,UF_Dest,"
            + "Modalidade,Valor_Frete, Orcamento) "
            + "VALUES"
            + "('"+F.getCodigoFrete()+"','"
            +F.getCEPRem()+"','"+F.getNomeRem()+"','"+F.getEndRem()+"','"+F.getBaiRem()+"','"+CodigoCidade(F.getNomeCidRem())+"','"
            +F.getNumRem()+"','"+F.getUFRem()+"','"+F.getCPFRem()+"','"+F.getCelRem()+"','"+F.getTelRem()+"','"+F.getEmailRem()+"','"
            +F.getCEPDest()+"','"+F.getNomeDest()+"','"+F.getEndDest()+"','"+F.getBaiDest()+"','"+CodigoCidade(F.getNomeCidDest())+"','"
            +F.getNumDest()+"','"+F.getUFDest()+"','"
            +F.getModalidade()+"','"+F.getValorFrete()+"','"+orcamento+"')";
        
        Connection con = (Connection) FabricaConexao.GetConexao();
        try {
            Statement st = con.prepareStatement(sql);
            st.executeUpdate(sql);
            
            InsertItens(F.getCodigoFrete(),F.getItensFrete());
            
            st.close();
            return true;
        } catch (SQLException ex) {
            System.out.println("Insert frete -> Erro: "+ex.getMessage()+"\n");
            return false;
        }
    }
        
    public static boolean ExcluirFrete(int cod){
        Connection con = (Connection) FabricaConexao.GetConexao();
        
        String sql = "DELETE FROM frete WHERE cod_frete ='"+cod+"'";
                
        try {
            ExcluirItens(cod);
            
            Statement st = con.createStatement();
            st.executeQuery(sql);
            
            st.close();
            return true;
        } catch (SQLException ex) {
            System.out.println("Delete itens -> "+ ex.getMessage()+"\n\n");
            return false;
        }
    }
    
    public static boolean ExcluirItens(int codFrete){
        
        String sql = "DELETE FROM item_frete WHERE cod_frete ='"+codFrete+"'";
        
        Connection con = (Connection) FabricaConexao.GetConexao();
                
        try {
            Statement st = con.createStatement();
            st.executeQuery(sql);
            
            st.close();
            
            return true;
        } catch (SQLException ex) {
            return false;
        }
    }
    
    public static ArrayList GetItens(int codFrete){
        ArrayList<ItemFrete> Itens = new ArrayList();
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql = "SELECT * FROM item_frete WHERE cod_frete = '"+codFrete+"'";
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            
            while(rs.next()){
                ItemFrete I = new ItemFrete();
                I.setCodigoFrete(codFrete);
                I.setCodigoItem(rs.getInt("cod_item"));
                I.setPeso(rs.getDouble("peso"));
                I.setVolume(rs.getDouble("volume"));
                I.setEmbalagem(rs.getString("embalagem"));
                Itens.add(I);
            }
            rs.close();
            st.close();
        
        } catch (SQLException ex) {
            System.out.printf("Get Itens -> Erro: "+ex.getMessage());
        }
        return Itens;
    }


    public static Frete GetFrete(int cod){
        Frete F = new Frete();
        Connection con = (Connection) FabricaConexao.GetConexao();
        String sql = "SELECT f.*, c.nome as nome_cid_rem, d.nome as nome_cid_dest\n" +
                     "FROM frete f, cidade c, cidade d\n" +
                     "WHERE cod_frete = '"+cod+"'\n" +
                     "AND f.cod_cid_rem = c.codigo AND f.cod_cid_dest = d.codigo";
       
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            
            if(rs.next()){
                F.setCodigoFrete( rs.getInt("cod_frete") );
                
                F.setCEPRem( rs.getString("cpf_rem") );
                F.setNomeRem( rs.getString("nome_rem") );
                F.setEndRem( rs.getString("end_rem") );
                F.setBaiRem( rs.getString("bai_rem") );
                F.setNomeCidRem( rs.getString("nome_cid_rem") );
                F.setNumRem( rs.getString("num_rem") );
                F.setUFRem( rs.getString("uf_rem") );
                F.setCPFRem( rs.getString("cpf_rem") );
                F.setTelRem( rs.getString("tel_rem") );
                F.setCelRem( rs.getString("cel_rem") );
                F.setEmailRem( rs.getString("email_rem") );

                F.setCEPDest( rs.getString("cep_dest") );
                F.setNomeDest( rs.getString("nome_dest") );
                F.setEndDest( rs.getString("end_dest") );
                F.setBaiDest( rs.getString("bai_dest") );
                F.setNomeCidDest( rs.getString("nome_cid_dest") );
                F.setNumDest( rs.getString("num_dest") );
                F.setUFDest( rs.getString("uf_dest") );

                F.setModalidade( rs.getString("modalidade") );
                F.setOrcamento( rs.getInt("orcamento") == 1 );
                
                F.setValorFrete(rs.getDouble("valor_frete"));
                rs.close();
                st.close();
                
                F.setItens(GetItens(cod));
                
            }
            
        } catch (SQLException ex) {
            System.out.printf("Get Frete -> Erro: "+ex.getMessage());
            
        }
        
        return F;
        
    }
    
}
